KotlinSpring_01_Kotlin 기초 이론
Kotlin이란?
JetBrains에서 2011년에 공개한 JVM 기반의 정적 타입 프로그래밍 언어다. 기존 자바(Java)가 가진 장황한 문법과 NULL 처리의 단점을 해결하기 위해 등장했다. 안드로이드(Android) 공식 언어로 지정되면서 폭발적으로 성장했고, 최근에는 Spring Boot 백엔드 개발 시장에서도 자바의 강력한 대체제로 자리 잡았다. 자바와 100% 상호운용성(Interoperability)을 보장하기 때문에 기존 자바 라이브러리를 그대로 가져다 쓸 수 있다는 점이 가장 큰 매력 포인트다.
주요 특징
- 정적 타입 & 타입 추론: 코틀린은 정적 타입 언어지만, 컴파일러가 문맥을 보고 타입을 유추해준다.
val name: String = "Fox"라고 굳이 쓰지 않고val name = "Fox"라고만 써도 알아서 String으로 인식한다. 덕분에 코드가 자바스크립트나 파이썬처럼 깔끔해 보인다. - Null Safety: 코틀린의 정체성 그 자체다. 자바 개발자를 평생 괴롭혀온
NullPointerException(NPE)을 언어 차원에서 차단한다. 변수에null이 들어갈 수 있는지 없는지를 타입 레벨에서 명확히 구분한다. - 함수형 프로그래밍 지원: 객체지향 프로그래밍(OOP)을 기본으로 하되, 람다식(Lambda)이나 고차 함수(Higher-order function) 같은 함수형 프로그래밍(FP) 개념을 적극적으로 도입했다.
변수와 타입
자바와 가장 먼저 체감되는 차이는 변수 선언 방식이다. 타입을 먼저 쓰는 게 아니라 val이나 var 키워드를 먼저 쓴다. 타입은 변수명 뒤에 온다.
불변(Immutable) vs 가변(Mutable)
코틀린은 변수가 나중에 바뀔 수 있는 놈인지, 한번 정해지면 끝까지 가는 놈인지를 엄격하게 따진다.
// val(Value): 읽기 전용 변수. 자바의 final과 비슷하다.
// 기본적으로 모든 변수는 val로 선언하는 습관을 들이는 게 좋다.
val name = "Kotlin"
// name = "Java" // 이렇게 값을 바꾸려고 하면 컴파일러가 빨간 줄을 긋는다.
// var(Variable): 변경 가능한 변수다.
// 꼭 값이 바뀌어야 하는 상황(예: for문의 카운터)에서만 쓴다.
var age = 10
age = 11 // 문제없다.
안정적인 프로그램을 만들려면 사이드 이펙트(Side Effect)를 줄여야 하고, 그 시작이 바로 변수를 불변으로 만드는 것이다. 그래서 코틀린 개발자들은 일단 val로 시작한다.
Null Safety(가장 중요)
코틀린의 변수는 태생적으로 null을 혐오한다. 아무 표시 없이 변수를 만들면 그건 무조건 값이 있어야 한다는 뜻이다(Non-Nullable). 만약 빈 값(null)을 허용하고 싶다면 타입 뒤에 물음표?를 붙여줘야 한다.
var a: String = "abc"
// a = null // 에러 발생! String 타입엔 오직 문자열만 들어갈 수 있다.
var b: String? = "abc"
b = null // 타입 뒤에 ?가 있으니 null을 넣어도 봐준다.
// Safe Call(?.): b가 혹시 null이면 실행하지 말고 그냥 null이 찍힌다.
println(b?.length) // b가 null이면 프로그램이 죽는 게 아니라 그냥 null이 찍힌다.
// Elvis Operator(?:): null일 때 대신 사용할 기본값을 지정한다.
val len = b?.length ?: 0 // b가 null이면 0을 쓰겠다는 뜻이다.
제어문과 표현식(Expression)
코틀린의 제어문은 단순한 명령이 아니라 '값'을 만들어내는 표현식으로 쓰일 때가 많다.
if-else
자바나 파이썬에서는 if문이 그냥 분기 처리를 위한 구문(Statement)이지만, 코틀린에서는 값을 뱉어내는 식(Expression)이다. 그래서 자바의 삼항 연산자(조건 ? 참 : 거짓)가 코틀린에는 없다. if문으로 똑같이, 아니 더 직관적으로 할 수 있기 때문이다.
// 조건에 따라 값을 바로 변수에 넣어버린다.
val currentMax = if (a > b) a else b
when(Switch 대체)
자바의 switch-case문은 기능이 좀 제한적이었는데, 코틀린의 when은 훨씬 강력하다. 단순히 같은 값인지 비교하는 걸 넘어서 타입 검사나 범위 검사까지 다 해준다.
val result = when (inputVal) {
1 -> "One" // 값이 1이면 이걸 리턴
2, 3 -> "Two or Three" // 여러 개도 묶을 수 있다
in 4..10 -> "Big Number" // 숫자 범위도 체크한다
is String -> "It's Text" // 심지어 변수 타입까지 검사한다
else -> "I don't know" // 위의 조건에 다 안 맞으면 실행 (default)
}
함수(Function)
함수는 fun이라는 키워드로 정의한다. 파이썬처럼 복잡한 로직이 없는 간단한 함수는 중괄호도 생략하고 한 줄로 끝낼 수 있다.
// 우리가 아는 일반적인 함수 모양
fun sum(a: Int, b: Int): Int {
return a + b
}
// 단일 표현식 함수(Single-Expression Function)
// 리턴 타입도 컴파일러가 알아서 추론해주니까 생략 가능하다.
fun sumSimple(a: Int, b: Int) = a + b
클래스와 데이터 클래스
기본적인 클래스
자바에서 클래스 하나 만들려면 멤버 변수 쓰고, 생성자 만들고, Getter/Setter까지... 코드가 엄청 길어졌다. 코틀린은 이걸 한 방에 해결한다.
// 이 한 줄이 자바의 20줄짜리 코드와 맞먹는다.
// 생성자 선언과 동시에 프로퍼티 정의가 끝난다.
class Person(val name: String, var age: Int)
data class(DTO용)
서버 개발을 하다 보면 데이터만 담아서 이리저리 옮기는 객체(DTO)를 정말 많이 만든다. 자바에선 롬복(Lombok) 라이브러리를 써서 해결했는데, 코틀린은 data 키워드 하나면 끝이다.
// data를 붙이면 equals(), hashCode(), toString() 같은 필수 메서드를 공짜로 만들어준다.
data class UserDto(val username: String, val email: String)